#include <bits/stdc++.h>
using namespace std;
//https://ac.nowcoder.com/acm/problem/255193
//贪心是错的，要枚举
// long long n,m,a,b;
// int main()
// {
//     cin>>n>>m>>a>>b;
//     long long ret=0;
//     for(long long x=0;x<=min(n/2,m);x++)
//     {
//         long long y=min(n-2*x,(m-x)/2);
//         ret=max(ret,a*x+b*y);
//     }
//     cout<<ret<<endl;
//     return 0;
// }


//https://www.nowcoder.com/practice/fbc5dad3e215457fb82a3ae688eb7281?tpId=230&tqId=39768&ru=/exam/oj
//贪心
//只要当前价格比前一天大，就卖出
// int a[100100];
// int n;
// int main()
// {
//     cin>>n;
//     for(int i=0;i<n;i++)cin>>a[i];
//     int earnings=0,minprice=0;
//     for(int i=1;i<n;i++)
//     {
//         if(a[i]>=a[i-1])earnings+=a[i]-a[i-1];
//     }
//     cout<<earnings<<endl;
//     return 0;
// }

//先整体反转，在挨个反转
//https://www.nowcoder.com/practice/ee5de2e7c45a46a090c1ced2fdc62355?tpId=182&tqId=34788&ru=/exam/oj

int main()
{
    string s;
    getline(cin,s);
    // string s1;
    reverse(s.begin(),s.end());
    int count=0;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]==' ')
        {
            reverse(s.begin()+(i-count),s.begin()+i);
            // s1+=s.substr((i-count),count)+" ";
            count=0;
        }
        else count++;
    }
    if(count>0)
    {
        reverse(s.end()-count,s.end());
        // s1+=s.substr(s.size()-count,s.size());
    }
    cout<<s<<endl;
    return 0;
}